package com.le.test;

import org.junit.Test;

import java.util.Stack;

/**
 * 小Q想要给他的朋友发送一个神秘字符串，但是他发现字符串的过于长了，于是小Q发明了一种压缩算法对字
 * 符串中重复的部分进行了压缩，
 * 对于字符串中连续的m个相同字符串S将会压缩为[m|S](m为一个整数且1<=m<=100)，
 * 例如字符串ABCABCABC将会被压缩为[3|ABC]，现在小Q的同学收到了小Q发送过来的字符串，你能帮助他进行解压缩么？
 *
 * "HG[3|B[2|CA]]F" --> "HGBCACABCACABCACAF"
 */
public class Code_02_StringReduce {
    @Test
    public void test1() {
        String str = "HG[3|B[2|CA]]F";
        Stack<Integer> stack = new Stack<>();
        StringBuffer res = new StringBuffer();
        int right = 0;
        for (char c : str.toCharArray()) {
            res.append(c + "");
            if (c == '[' || c == '|') {
                stack.push(right);
            }
            if (c == ']') {
                if (stack.size() >= 2) {
                    Integer l = stack.pop(); // | 位置
                    Integer r = stack.pop(); // [ 位置
                    StringBuffer buffer = new StringBuffer();
                    String s = res.substring(l + 1, right); //获取 | 后字符
                    int num = Integer.parseInt(res.substring(r + 1, l));
                    for (int i = 0; i < num; i++) {
                        buffer.append(s);
                    }
                    res = res.replace(r, right + 1, buffer.toString()); // 消掉一对[]
                    // 重新定位right
                    right = r + buffer.length() - 1;
                }
            }
            right++;
        }
        System.out.println(res.toString());
    }
}
